/**
 * @author 陈泰来
 * @version V1.0
 * @Project echo-java-base
 * @Title 逃离GC
 * @Description *
 * @Package jvm.exception
 * @date 2021/3/25 3:31 下午
 * @Copyright:学如逆水行舟，不进则退 .
 */
package jvm.exception;

import java.util.concurrent.TimeUnit;

public class FinalizeEscapeGc {

    static FinalizeEscapeGc toLive = null;

    public static void main(String[] args) throws InterruptedException {

        toLive = new FinalizeEscapeGc();
        toLive = null;
        System.out.println("第一次触发GC");
        //触发第一次GC
        System.gc();

        TimeUnit.MILLISECONDS.sleep(3000);

        if (toLive != null) {
            System.out.println("我还活着 (*^▽^*)");
        } else {
            System.out.println("我死了 (⊙︿⊙)");
        }

        toLive = null;
        System.out.println("第二次触发GC");
        //触发第二次GC
        System.gc();

        TimeUnit.MILLISECONDS.sleep(3000);

        if (toLive != null) {
            System.out.println("我还活着 (*^▽^*)");
        } else {
            System.out.println("我死了 (⊙︿⊙)");
        }


    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        //finalize 方法并没有承诺被一定要执行结束才能做后续操作，就是为了避免 这种死循环或者执行非常缓慢的情况。这里展示了死循环的案例
//        关联自己
        for(;;){
            toLive = this;
            System.out.println("我拯救了自己");
        }
    }
}
